<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // class  类 会创建一个基于原型继承的具有给定名称的新类。

    // 1. 类的声明 (不能提升)
    class Person {
      #weight = '50kg' // 私有属性 只能类的内部调用 子类和外部不能调用
      // 构造方法  constructor 函数会在实例化的时候执行
      constructor(name, age) {
        // console.log(this); // 这里的this指向 Person的实例对象
        // 1.1 声明属性
        this.name = name
        this.age = age
      }
      // 1.2 声明方法 类的固定写法
      speak () {
        console.log(this); // 这里的this指向调用方法的人
        console.log(`我是${this.name},今年${this.age}岁 `);
      }
      // 支持get和set
      get height () {
        console.log("get");
        return '175cm';
      }
      set height (newvalue) {
        console.log('set被执行');
        console.log("??", newvalue);
      }
    }

    // 2.创建实例对象
    const p = new Person('theshy', 18)
    console.log(p); //  p是实例对象
    console.log(Person); // 输出的是类本身  
    p.speak()  // 调用speak方法

    p.height
    console.log(p.height); // 执行get里的语句
    p.height = '176cm'  // set被执行

    // 2.类的继承 
    // 声明一个Student类  继承Person (extends 继承)
    class Student extends Person {
      constructor(name, age, grade) {
        // 继承的是父类的属性  super关键字调用必须在this之前
        super(name, age)
        this.grade = grade
      }
      study () {
        console.log('我的年级是${this.grade} ');
      }
    }

    const s = new Student('xiaoming', 20, '高三')
    console.log(s);
    s.study()


    class Phone {
      //static  类的静态属性 
      static name = '手机';
      static change () {
        console.log("我可以改变世界");
      }
    }
    let nokia = new Phone();
    console.log(nokia.name); //undefined 实例对象访问不到 
    console.log(Phone.name);//手机
    // 对于static标注的属性和方法 属于 类 但不属于实例对象


  </script>
</body>

</html>